package vista;

import java.awt.Canvas;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;

import algo3.display.Imagen;

import modelo.Configuracion;
import modelo.escenario.Carrera;
import modelo.juego.Juego;

public class CarreraCanvas extends Canvas{
	/*CONSTANTES*/
	private static final double UNIDADES_FACTOR = 0.02;
	
	/*ATRIBUTOS ESTATICOS*/	
	
	private static final long serialVersionUID = 1L;

	/*ATRIBUTOS*/	
	
	private Juego juego;
	
	private long posicionFondo;
	private long offsetOponente;
	
	private BufferStrategy estrategia;

	
	private Imagen bkg1_img;
	private Imagen bkg2_img;
	private Imagen auto1_img;
	private Imagen auto2_img;
	
	private Imagen interface_img;
	private Imagen rpm_img;
	private Imagen vel_img;
	
	private Imagen msj_timeout_img;
	private Imagen msj_win_img;
	private Imagen msj_lose_img;
	private Imagen msj_crash_img;
	
	private Imagen human_img;
	private Imagen comp_img;
	
	
	
	
	/*public CarreraCanvas(Juego juego, JFrame parentFrame) {
		this.juego = juego;
		// Utilizamos doble buffer
		JPanel panel = (JPanel)parentFrame.getContentPane();
		panel.add(this);
		*/
	public CarreraCanvas() {
		
	}
	
	public void inicializar(Juego juego) {
		this.juego = juego;

			
		createBufferStrategy(2);
		
		
		// Obtenemos los buffers de memoria y los almacenamos en nuestro BufferStrategy "estrategia"
		estrategia = getBufferStrategy();
		
		// Fondos
		
		int sup = juego.getTipoPista() + 1;
		bkg1_img = new Imagen(Configuracion.PATH_SPRITES + "pista" + sup + ".jpg");
		bkg2_img = new Imagen(Configuracion.PATH_SPRITES + "pista" + sup + ".jpg");
		
		// Autos
		auto1_img = new Imagen(Configuracion.PATH_SPRITES + "auto1.gif");
		auto2_img = new Imagen(Configuracion.PATH_SPRITES + "auto2.gif");	
		
		auto1_img.setPosY(320);
		auto1_img.setPosX(440);
		
		auto2_img.setPosY(320);
		auto2_img.setPosX(260);
		
		// Mensajes
		msj_timeout_img = new Imagen(Configuracion.PATH_SPRITES + "msj_timeout.png");
		msj_win_img = new Imagen(Configuracion.PATH_SPRITES + "msj_win.png");
		msj_lose_img = new Imagen(Configuracion.PATH_SPRITES + "msj_lose.png");
		msj_crash_img = new Imagen(Configuracion.PATH_SPRITES + "msj_crash.png");
		
		msj_timeout_img.setPosX(232);
		msj_timeout_img.setPosY(200);
		
		msj_win_img.setPosX(232);
		msj_win_img.setPosY(200);
		
		msj_lose_img.setPosX(232);
		msj_lose_img.setPosY(200);
		
		msj_crash_img.setPosX(232);
		msj_crash_img.setPosY(200);

		// Inteface		
		interface_img = new Imagen(Configuracion.PATH_SPRITES + "ingame.png");	
		
		human_img = new Imagen(Configuracion.PATH_SPRITES + "human.png");
		human_img.setPosY(480);
		human_img.setPosX(570);
		comp_img = new Imagen(Configuracion.PATH_SPRITES + "computer.png");	
		comp_img.setPosY(480);
		comp_img.setPosX(570);
		
		// Agujas		
		vel_img = new Imagen(Configuracion.PATH_SPRITES + "vel.png");
		rpm_img = new Imagen(Configuracion.PATH_SPRITES + "rpm.png");	
		
		vel_img.setPosY(465);
		vel_img.setPosX(70);
		vel_img.setPivoteY(60);
		vel_img.setPivoteX(3);
		vel_img.setRotacion(- Math.PI * 0.8);
		
		rpm_img.setPosY(487);
		rpm_img.setPosX(204);
		rpm_img.setPivoteY(40);
		rpm_img.setPivoteX(3);
		rpm_img.setRotacion(- Math.PI * 0.8);
		
		// Atributos para el scroll
		offsetOponente = 0;
		posicionFondo = 0;
		
		setBounds(0,30,800,570);
		
		
		
		
	}
	
	
	public void dibujar() {
		
		actualizarScroll();
	
		actualizarPosiciones();
		
		actualizarAgujas();
	
		// Llamamos a getDrawGraphics para poder dibujar en el buffer de dibujo.
		Graphics2D grafico = (Graphics2D)estrategia.getDrawGraphics();

		
		bkg1_img.dibujar(grafico);
		bkg2_img.dibujar(grafico);
		auto1_img.dibujar(grafico);
		
		// Control para performance
		if(auto2_img.getPosY() > -auto2_img.getAlto() && auto2_img.getPosY() < 600)
			auto2_img.dibujar(grafico);		
		
		interface_img.dibujar(grafico);
		vel_img.dibujar(grafico);
		rpm_img.dibujar(grafico);
		
		comp_img.dibujar(grafico);
		human_img.dibujar(grafico);
		
		if(juego.getCarrera().getEstado() == Carrera.FIN) {
			msj_timeout_img.dibujar(grafico);
		}
		else if(juego.getCarrera().getEstado() == Carrera.GANO) {
			msj_win_img.dibujar(grafico);
		}
		else if(juego.getCarrera().getEstado() == Carrera.PERDIO) {
			msj_lose_img.dibujar(grafico);
		}
		else if(juego.getCarrera().getEstado() == Carrera.ROMPIO) {
			msj_crash_img.dibujar(grafico);
		}
		
		
		/*Llamamos al buffer visible para mostrar lo que queremos dibujar en pantalla*/
		estrategia.show();
	} 
	
	
	
	/*METODOS PRIVADOS*/
	
	private void actualizarScroll () {
		// Scroll de la pista, segun la velocidad del auto, para simular que sigue su paso.
		posicionFondo += Math.round(juego.getJugador().getVelocidad()*UNIDADES_FACTOR);		
		//System.out.println(Math.round(juego.getJugador().getVelocidad()*UNIDADES_FACTOR));
		if (posicionFondo > 600){
			posicionFondo = 0;
		}		
		
		
		offsetOponente = Math.round((juego.getOponentes().get(0).getPosicion() - juego.getJugador().getPosicion())*UNIDADES_FACTOR); 
	}
	
	private void actualizarPosiciones () {
		
		bkg1_img.setPosY((int)posicionFondo);
		bkg2_img.setPosY((int)posicionFondo - 600);
		auto2_img.setPosY(auto1_img.getPosY() - (int)offsetOponente);
		
		double pista_largo = juego.getCarrera().getPista().getLongitud();
		double pos_com = juego.getOponentes().get(0).getPosicion();
		double pos_hum = juego.getJugador().getPosicion();
		
		int comPosX = (int) (pos_com * 200 / pista_largo + 570);
		int humPosX = (int) (pos_hum * 200 / pista_largo + 570);
		
		comp_img.setPosX(comPosX );
		human_img.setPosX(humPosX );
	}
	
	private void actualizarAgujas () {
		double maxRot = Math.PI * 1.8;
		
		double maxRPM = juego.getJugador().getAuto().getMaxRPM();
		double actualRPM = juego.getJugador().getAuto().getRPM();
		double rotRPM = actualRPM * maxRot / maxRPM - Math.PI * 0.8;
		
	
		double maxVel = juego.getJugador().getAuto().getMaxVelocidad();
		double actualVel = juego.getJugador().getAuto().getVelocidad();
		double rotVel = actualVel * maxRot / maxVel- Math.PI * 0.8;
		
		
		rpm_img.setRotacion(rotRPM);
		vel_img.setRotacion(rotVel);
	}
	
	

}
